package clara.azin.view;


import java.util.Observable;
import java.util.Observer;


import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;

import clara.azin.controller.WebTreeAzinController;

//Classe che gestisce la vista del modello

public class WebTreeAzinView extends Shell implements Observer {
	
	protected void checkSubclass() {}

//	il canvas su cui disegnare l'albero
	public Canvas canvas;

//	il riferimento al controller
	public WebTreeAzinController controller;

//	contiene la pagina che sta parsando
	public Text status;
	
//	contiene il link dell'elemento dell'albero puntato dal mouse
//	il testo della pagina della quale si vuole costruire l'albero
	public Text link,text;

//	check button che indichera' se la esecuzione ignorera' o meno la cache
	public Button check, buttonT ,buttonC;

//	spinner che indichera' il livello di profondita' dell'analisi del sito
	public Spinner depthSpinner;

//	etichetta che indichera' se e'in funzione il parser
	public Label toggle, spinner;

//	item del menu', serono per salvare e caricare i grafi nelle 2 possibili visualizzazioni
	public MenuItem saveT, loadT, viewT, viewC;

	public ScrolledComposite scrolledComposite;
//	Costruisce la vista
//	controller e' il controller che gestisce tale vista

	public WebTreeAzinView(WebTreeAzinController controller ) {
		super( controller.display );
		this.controller = controller;
		setLayout( new GridLayout( 5, false ) );
		addDisposeListener( controller );
		this.setText("WebTreeAzin");
		
		Menu menuBar = new Menu (this, SWT.BAR);
		MenuItem p = new MenuItem(menuBar, SWT.CASCADE);
		p.setText("File");
		
		Menu strategies = new Menu (this, SWT.DROP_DOWN);
		p.setMenu(strategies);
		
		//bottoni per salvataggio e caricamento (visualizzazione ad albero)
		saveT = new MenuItem (strategies, SWT.BUTTON1);
		loadT = new MenuItem (strategies, SWT.BUTTON2);
		saveT.setText ("Save TreeFile");
		saveT.addSelectionListener(controller.saveFileListener);
		loadT.setText("Load TreeFile");
		loadT.addSelectionListener(controller.loadFileListener);

		this.setMenuBar (menuBar);
		text = new Text(this,SWT.SINGLE | SWT.SHADOW_IN | SWT.BORDER);
		GridData textGridData = new GridData(GridData.FILL_HORIZONTAL);
		textGridData.widthHint = 500;
		text.setLayoutData(textGridData);
		text.setText("http://");
		text.addKeyListener(controller.ReturnListener);				
		spinner = new Label(this,SWT.NONE );
		spinner.setText("Profondita': ");
		
		depthSpinner = new Spinner(this, SWT.SHADOW_IN | SWT.BORDER);  
		depthSpinner.setMinimum(0);
		depthSpinner.setMaximum(10);
		depthSpinner.setSelection(1);

		
		MenuItem pv = new MenuItem(menuBar, SWT.CASCADE);
		pv.setText("Visualizza");
		Menu strategies2 = new Menu (this, SWT.DROP_DOWN);
		pv.setMenu(strategies2);
		//bottoni per salvataggio e caricamento (visualizzazione a circonferenza)
		viewT = new MenuItem (strategies2, SWT.RADIO);
		viewC = new MenuItem (strategies2, SWT.RADIO);
		viewT.setSelection(true);
		viewT.setText ("Vista albero");
		viewC.setText ("Vista circonferenza");
		viewT.addSelectionListener(controller.treeViewListener);
		viewC.addSelectionListener(controller.circonfViewListener);
		
		
		// ZOOM +
		Button zoom_plus = new Button(this, SWT.NONE);
		zoom_plus.setText("+");
		zoom_plus.addSelectionListener(controller.buttonListenerZPlus);
		
		// ZOOM -
		Button zoom_minus = new Button(this, SWT.NONE);
		zoom_minus.setText("-");
		zoom_minus.addSelectionListener(controller.buttonListenerZMinus);
		
		//Bottone di avvio
		Button button = new Button(this,SWT.NONE);
		button.setText("Go!");
		button.addSelectionListener(controller.buttonListener);
		
		GridData gridData = new GridData( GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
		gridData.horizontalSpan = 5;
		gridData.heightHint = WebTreeAzinController.HEIGHT;
		gridData.widthHint = WebTreeAzinController.WIDTH;
		scrolledComposite = new ScrolledComposite(this, SWT.H_SCROLL | SWT.V_SCROLL);
		scrolledComposite.setLayoutData( gridData );
		canvas = new Canvas(scrolledComposite,  SWT.SHADOW_IN | SWT.BORDER | SWT.CENTER);
		scrolledComposite.setContent( canvas );
		canvas.setBackground(new Color(controller.display,255,255,255));
		canvas.setSize(WebTreeAzinController.WIDTH,WebTreeAzinController.HEIGHT);
		canvas.addMouseMoveListener(controller.mouseTrackListener);
		canvas.addMouseListener(controller.mouseListener);
		canvas.addPaintListener(controller.paintListener);
		canvas.redraw();
		
		link = new Text(this,SWT.NONE);
		
		GridData linkGridData = new GridData(GridData.FILL_HORIZONTAL);
		linkGridData.widthHint = 500;
		linkGridData.horizontalSpan = 3;
		link.setLayoutData(linkGridData);
		link.setEnabled(false);		
		
		status = new Text(this,SWT.NONE);
		GridData statusGridData = new GridData(GridData.FILL_HORIZONTAL);
		statusGridData.widthHint = 200;
		status.setLayoutData(statusGridData);
		status.setEnabled(false);		

		
		
		toggle = new Label(this,SWT.NONE);
		toggle.setBackground( new Color(controller.display,0,150,0));
		GridData toggleGridData = new GridData();
		toggleGridData.widthHint = 20;
		toggleGridData.heightHint = 20;
		toggle.setLayoutData(toggleGridData);
		toggle.setText(" ");
		
		
		pack();
		open();
	}
	

//	Aggiorna la vista quando gli osservatori notificano un cambiamento del modello
	public void update( Observable o, Object arg ) {		
		
		int h = (int)  ((float) WebTreeAzinController.HEIGHT * controller.scale);
		int w = (int)  ((float) WebTreeAzinController.WIDTH * controller.scale);
		canvas.setSize(w, h);
		canvas.redraw();
		canvas.update();
	
	}



}
